﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Entidades;
using Negocio;
using Mundialeitor.App_Util;

namespace Mundialeitor
{
    public partial class UsuarioABM : PaginaBase
    {
        private UsuarioEntity usuario;
        public UsuarioEntity Usuario
        {
            get { return usuario; }
            set { usuario = value; }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            Usuario = (UsuarioEntity)Session["usuario"];

            if (Usuario != null && Usuario.TipoUsuario.Id == (int)EnumTipoUsuario.Administrador)
            {
                if (!IsPostBack)
                {
                    
                }
            }
            else
            {
                Server.Transfer(PagesConstants.Login);
            }
        }

        protected void btnConsultar_Click(object sender, EventArgs e)
        {
            try
            {
                string login = txtLogin.Text.Trim();

                var regla = new UsuarioRules();                
                var lista = regla.SeleccionarUsuarioPorFiltro(login);

                CargarGrilla(lista);
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        private void CargarGrilla(List<UsuarioEntity> lista)
        {
            Session["datosGrilla"] = lista;
            Utilidades.CargarGrilla(gvGrilla, lista);
        }

        protected void gvGrilla_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            try
            {
                gvGrilla.PageIndex = e.NewPageIndex;
                gvGrilla.DataSource = (List<UsuarioEntity>)Session["datosGrilla"];
                gvGrilla.DataBind(); 
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        protected void gvGrilla_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                if (!(e.CommandName == "Ver" || e.CommandName == "Eliminar"))
                {
                    return;
                }

                gvGrilla.SelectedIndex = Convert.ToInt32(e.CommandArgument);
                int id = int.Parse(gvGrilla.SelectedDataKey["Id"].ToString());

                UsuarioEntity usuarioSeleccionado = ObtenerUsuario(id);
                Session["usuarioSeleccionado"] = usuarioSeleccionado;

                // Definir el estado del control de usuario
                switch (e.CommandName)
                {
                    case "Ver":
                        CargarDatosUsuario(usuarioSeleccionado, true);
                        break;
                    case "Eliminar":
                        CargarDatosUsuario(usuarioSeleccionado, false);
                        break;
                }

                ModoConsulta(false);
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        private void ModoConsulta(bool valor)
        {
            divConsulta.Visible = valor;
            divABM.Visible = !valor;

            LimpiarGrilla();
        }

        protected void gvGrilla_RowCreated(object sender, GridViewRowEventArgs e)
        {
            try
            {
                // Asociación de CommandArgument de cada fila con el id de la entidad
                if (e.Row.RowType == DataControlRowType.DataRow)
                {
                    ImageButton btn;
                    //Boton Ver
                    btn = (ImageButton)e.Row.FindControl("btnVer");
                    btn.CommandArgument = e.Row.RowIndex.ToString();
                    //Boton Eliminar
                    btn = (ImageButton)e.Row.FindControl("btnEliminar");
                    btn.CommandArgument = e.Row.RowIndex.ToString();
                }
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        protected void gvGrilla_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            try
            {

            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        protected void btnAceptar_Click(object sender, EventArgs e)
        {
            try
            {
                UsuarioEntity usuarioSeleccionado = (UsuarioEntity)Session["usuarioSeleccionado"];

                if (usuarioSeleccionado == null)
                {
                    AltaUsuario();                    
                }
                else
                {
                    ModificacionUsuario(usuarioSeleccionado);
                }                
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        private void ModificacionUsuario(UsuarioEntity usuarioSeleccionado)
        {
            var reglaUsuario = new UsuarioRules();

            if (ValidarDatos())
            {
                TomarDatos(usuarioSeleccionado);

                reglaUsuario.GuardarUsuario(usuarioSeleccionado);
                MostrarMensajeDialogo(EnumTipoDeMensaje.Informacion, "Se actualizó correctamente.");
                ModoConsulta(true);
            }            
        }

        private void AltaUsuario()
        {
            var reglaUsuario = new UsuarioRules();
            var usuario = new UsuarioEntity();

            if (ValidarDatos())
            {
                TomarDatos(usuario);
                usuario.FechaAlta = DateTime.Today;

                reglaUsuario.CrearUsuario(usuario);
                MostrarMensajeDialogo(EnumTipoDeMensaje.Informacion, "Se agregó correctamente.");
                ModoConsulta(true);
            }
        }

        private void TomarDatos(UsuarioEntity usuarioSeleccionado)
        {
            usuarioSeleccionado.Nombre = txtNombreUsuario.Text.Trim();
            usuarioSeleccionado.Apellido = txtApellidoUsuario.Text.Trim();
            usuarioSeleccionado.Login = txtLoginUsuario.Text.Trim();
            usuarioSeleccionado.Password = txtPasswordUsuario.Text.Trim();
            usuarioSeleccionado.Email = txtEmailUsuario.Text.Trim();

            int tipoUsuario = (int.Parse(ddlTipoUsuario.SelectedValue));
            var reglaTipoUsuario = new TipoUsuarioRules();
            usuarioSeleccionado.TipoUsuario = reglaTipoUsuario.ObtenerTipoUsuario(tipoUsuario);
        }

        private bool ValidarDatos()
        {
            bool valor = true;

            if (String.IsNullOrEmpty(txtLoginUsuario.Text.Trim()) && String.IsNullOrEmpty(txtLoginUsuario.Text.Trim()) && String.IsNullOrEmpty(txtEmailUsuario.Text.Trim()))
            {
                valor = false;
            }
            return valor;
        }

        protected void btnAgregar_Click(object sender, EventArgs e)
        {
            try
            {
                Session["usuarioSeleccionado"] = null;
                ModoConsulta(false);
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        protected void btnEliminar_Click(object sender, EventArgs e)
        {
            try
            {
                var regla = new UsuarioRules();
                var usuarioSeleccionado = (UsuarioEntity)Session["usuarioSeleccionado"];

                if (usuarioSeleccionado != null)
                {
                    regla.EliminarUsuario(usuarioSeleccionado.Id);
                    MostrarMensajeDialogo(EnumTipoDeMensaje.Informacion, "Se eliminó correctamente.");
                    ModoConsulta(true);
                }
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }
     
        private void LimpiarControles()
        {
            txtNombreUsuario.Text = String.Empty;
            txtApellidoUsuario.Text = String.Empty;
            ddlTipoUsuario.SelectedIndex = 0;
            txtLoginUsuario.Text = String.Empty;
            txtPasswordUsuario.Text = String.Empty;
            txtEmailUsuario.Text = String.Empty;
        }

        private void LimpiarGrilla()
        {
            gvGrilla.DataSource = null;
            gvGrilla.DataBind();
        }

        private void CargarDatosUsuario(UsuarioEntity usuarioSeleccionado, bool valor)
        {
            txtNombreUsuario.Text = usuarioSeleccionado.Nombre;
            txtApellidoUsuario.Text = usuarioSeleccionado.Apellido;
            ddlTipoUsuario.SelectedValue = usuarioSeleccionado.TipoUsuario.Id.ToString();
            txtLoginUsuario.Text = usuarioSeleccionado.Login;
            txtPasswordUsuario.Text = usuarioSeleccionado.Password;
            txtEmailUsuario.Text = usuarioSeleccionado.Email;

            HabilitarControles(valor);
        }
        
        private void HabilitarControles(bool valor)
        {
            txtNombreUsuario.Enabled = valor;
            txtApellidoUsuario.Enabled = valor;
            ddlTipoUsuario.Enabled = valor;
            txtLoginUsuario.Enabled = valor;
            txtPasswordUsuario.Enabled = valor;
            txtEmailUsuario.Enabled = valor;

            btnAceptar.Visible = valor;
            btnEliminar.Visible = !valor;
        }
        
        private UsuarioEntity ObtenerUsuario(int id)
        {
            List<UsuarioEntity> lista = (List<UsuarioEntity>)Session["datosGrilla"];

            var q = (from u in lista where u.Id == id select u).FirstOrDefault();

            return q;
        }

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            try
            {
                LimpiarControles();
                HabilitarControles(true);
                ModoConsulta(true);
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }
    }
}
